/**
在TypeScript中，接口的类实现过程是一个重要的概念，它允许类遵循特定的结构和行为规范。
  1. 接口的定义
  - 接口用于定义对象的结构，包括属性和方法。通过接口，开发者可以指定类需要实现的属性和方法。
  - 例如：
  interface Animal {
      name: string; // 属性
      eat(): void;  // 方法
  }
  2. 类的实现
  - 类通过使用  `implements`  关键字来实现接口。实现接口的类必须提供接口中定义的所有属性和方法的具体实现。
  - 例如：
  class Dog implements Animal {
      name: string; // 实现属性

      constructor(name: string) {
          this.name = name; // 初始化属性
      }

      eat() {
          console.log(`${this.name} 正在吃东西`); // 实现方法
      }
  }
  3. 实现多个接口
  - 一个类可以实现多个接口，类需要提供所有接口中定义的属性和方法的实现。
  - 例如：
  interface CanBark {
      bark(): void;
  }

  class Labrador implements Animal, CanBark {
      name: string;

      constructor(name: string) {
          this.name = name;
      }

      eat() {
          console.log(`${this.name} 正在吃东西`);
      }

      bark() {
          console.log(`${this.name} 汪汪叫`);
      }
  }
  4. 接口的继承
  - 接口可以继承其他接口，类在实现时也需要实现所有继承的接口的属性和方法。
  - 例如：
  interface Pet extends Animal {
      play(): void; // 新增方法
  }

  class Cat implements Pet {
      name: string;

      constructor(name: string) {
          this.name = name;
      }

      eat() {
          console.log(`${this.name} 正在吃东西`);
      }

      play() {
          console.log(`${this.name} 正在玩耍`);
      }
  }
  5. 类型检查
  - TypeScript会在编译阶段进行类型检查，确保实现类符合接口的结构。如果类没有实现接口中定义的所有属性和方法，编译器会报错。
  - 例如：
  class Fish implements Animal {
      name: string;

      constructor(name: string) {
          this.name = name;
      }

      // 如果缺少 eat() 方法，编译时会报错
  }
  6. 总结
  接口的类实现过程在TypeScript中提供了一种强类型的结构，使得类能够遵循特定的规范。通过接口，开发者可以确保类实现了所需的属性和方法，从而提高代码的可维护性和可读性。这种机制在大型项目中尤为重要，因为它有助于定义清晰的API和模块化的设计。
 */
interface IPerson {
  name: string
  age: number
  eating: () => void
}

interface IStudent {
  stuId: number
  studying: () => void
}

const obj: IPerson = {
  name: "class-name",
  age: 18,
  eating: () => {
    console.log("eating")
  }
}

// 作用: 接口被类实现
class Person implements IPerson, IStudent {
  name: string
  age: number
  stuId: number

  studying: () => void
  eating: () => void  
}

const p = new Person()
console.log(p.name, p.age, p.stuId, p.eating(), p.studying());

export {}